const mysql = require('mysql2/promise');

/**
 * MySQL数据库连接测试脚本
 * 使用方法:
 *   node test-mysql.js
 *   node test-mysql.js --host=localhost --user=root --password=123456 --database=mydb
 *   DB_PASSWORD=123456 node test-mysql.js
 */

// 解析命令行参数
function parseArgs() {
  const args = process.argv.slice(2);
  const config = {};
  
  args.forEach(arg => {
    if (arg.startsWith('--')) {
      const [key, value] = arg.substring(2).split('=');
      config[key] = value;
    }
  });
  
  return config;
}

async function testConnection() {
  console.log('========================================');
  console.log('🔍 MySQL 数据库连接测试');
  console.log('========================================\n');

  // 解析命令行参数
  const cmdArgs = parseArgs();

  // 数据库配置（优先级：命令行参数 > 环境变量 > 默认值）
  const config = {
    host: cmdArgs.host || process.env.DB_HOST || '49.51.193.79',
    port: parseInt(cmdArgs.port || process.env.DB_PORT || '3306'),
    user: cmdArgs.user || process.env.DB_USERNAME || 'prompt',
    password: cmdArgs.password || process.env.DB_PASSWORD || '42SSH3Br6AH2RsJ2',
    database: cmdArgs.database || process.env.DB_DATABASE || 'prompt',
  };

  console.log('📋 连接配置:');
  console.log(`   主机: ${config.host}`);
  console.log(`   端口: ${config.port}`);
  console.log(`   用户: ${config.user}`);
  console.log(`   密码: ${config.password ? '***' + config.password.slice(-2) : '(未设置)'}`);
  console.log(`   数据库: ${config.database}`);
  console.log('');

  if (!config.password) {
    console.log('⚠️  警告: 未设置密码');
    console.log('');
    console.log('💡 设置密码的方法:');
    console.log('   1. 使用命令行参数:');
    console.log('      node test-mysql.js --password=your_password');
    console.log('');
    console.log('   2. 使用环境变量:');
    console.log('      DB_PASSWORD=your_password node test-mysql.js');
    console.log('');
    console.log('   3. 完整配置示例:');
    console.log('      node test-mysql.js --host=49.51.193.79 --user=prompt --password=your_password --database=prompt');
    console.log('');
  }

  let connection;

  try {
    // 1. 测试连接
    console.log('🔄 步骤 1: 连接数据库...');
    connection = await mysql.createConnection(config);
    console.log('✅ 连接成功！\n');

    // 2. 测试数据库版本
    console.log('🔄 步骤 2: 查询数据库版本...');
    const [versionResult] = await connection.query('SELECT VERSION() as version');
    console.log(`✅ MySQL 版本: ${versionResult[0].version}\n`);

    // 3. 测试当前数据库
    console.log('🔄 步骤 3: 查询当前数据库...');
    const [dbResult] = await connection.query('SELECT DATABASE() as current_db');
    console.log(`✅ 当前数据库: ${dbResult[0].current_db}\n`);

    // 4. 查询数据库列表
    console.log('🔄 步骤 4: 查询数据库列表...');
    const [databases] = await connection.query('SHOW DATABASES');
    console.log('✅ 可用数据库:');
    databases.forEach(db => {
      const dbName = db.Database;
      const indicator = dbName === config.database ? ' ⭐' : '';
      console.log(`   - ${dbName}${indicator}`);
    });
    console.log('');

    // 5. 查询表列表
    console.log('🔄 步骤 5: 查询数据库表...');
    const [tables] = await connection.query('SHOW TABLES');
    if (tables.length > 0) {
      console.log(`✅ 找到 ${tables.length} 个表:`);
      tables.forEach((table, index) => {
        const tableName = Object.values(table)[0];
        console.log(`   ${index + 1}. ${tableName}`);
      });
    } else {
      console.log('⚠️  数据库中没有表');
    }
    console.log('');

    // 6. 如果有表，查询第一个表的结构
    if (tables.length > 0) {
      const firstTable = Object.values(tables[0])[0];
      console.log(`🔄 步骤 6: 查询表 "${firstTable}" 的结构...`);
      const [columns] = await connection.query(`DESCRIBE ${firstTable}`);
      console.log(`✅ 表结构 (${columns.length} 个字段):`);
      columns.forEach(col => {
        console.log(`   - ${col.Field} (${col.Type}) ${col.Null === 'NO' ? 'NOT NULL' : ''} ${col.Key ? `[${col.Key}]` : ''}`);
      });
      console.log('');
    }

    // 7. 测试查询性能
    console.log(`🔄 步骤 ${tables.length > 0 ? '7' : '6'}: 测试查询性能...`);
    const startTime = Date.now();
    await connection.query('SELECT 1 as test');
    const endTime = Date.now();
    console.log(`✅ 查询响应时间: ${endTime - startTime}ms\n`);

    // 8. 查询服务器状态
    console.log(`🔄 步骤 ${tables.length > 0 ? '8' : '7'}: 查询服务器状态...`);
    const [status] = await connection.query("SHOW STATUS WHERE Variable_name IN ('Threads_connected', 'Uptime', 'Questions')");
    console.log('✅ 服务器状态:');
    status.forEach(stat => {
      let value = stat.Value;
      // 格式化 Uptime (秒转换为易读格式)
      if (stat.Variable_name === 'Uptime') {
        const days = Math.floor(value / 86400);
        const hours = Math.floor((value % 86400) / 3600);
        const minutes = Math.floor((value % 3600) / 60);
        value = `${value}秒 (${days}天 ${hours}小时 ${minutes}分钟)`;
      }
      console.log(`   - ${stat.Variable_name}: ${value}`);
    });
    console.log('');

    console.log('========================================');
    console.log('🎉 所有测试通过！数据库连接正常！');
    console.log('========================================');

    return true;

  } catch (error) {
    console.error('');
    console.error('========================================');
    console.error('❌ 数据库连接测试失败');
    console.error('========================================');
    console.error('');
    console.error('错误详情:');
    console.error(`   错误代码: ${error.code}`);
    console.error(`   错误消息: ${error.message}`);
    console.error(`   SQL 状态: ${error.sqlState || 'N/A'}`);
    if (error.sql) {
      console.error(`   SQL 语句: ${error.sql}`);
    }
    console.error('');

    // 错误诊断
    console.error('🔧 诊断建议:');
    switch (error.code) {
      case 'ECONNREFUSED':
        console.error('   ❌ 连接被拒绝');
        console.error('   → 请检查数据库服务是否启动');
        console.error('   → 请检查主机地址和端口是否正确');
        console.error('   → 请检查防火墙设置');
        break;
      case 'ER_ACCESS_DENIED_ERROR':
        console.error('   ❌ 访问被拒绝');
        console.error('   → 请检查用户名和密码是否正确');
        console.error('   → 请检查用户是否有权限访问该数据库');
        console.error('');
        console.error('   💡 正确的使用方法:');
        console.error('      node test-mysql.js --password=正确的密码');
        break;
      case 'ER_BAD_DB_ERROR':
        console.error('   ❌ 数据库不存在');
        console.error('   → 请检查数据库名称是否正确');
        console.error('   → 请先创建数据库');
        break;
      case 'ETIMEDOUT':
        console.error('   ❌ 连接超时');
        console.error('   → 请检查网络连接');
        console.error('   → 请检查数据库服务器是否可访问');
        break;
      case 'ENOTFOUND':
        console.error('   ❌ 主机未找到');
        console.error('   → 请检查主机地址是否正确');
        console.error('   → 请检查DNS解析');
        break;
      default:
        console.error('   → 请检查数据库配置');
        console.error('   → 请查看完整错误信息');
    }
    console.error('');
    
    return false;

  } finally {
    // 关闭连接
    if (connection) {
      await connection.end();
      console.log('🔌 数据库连接已关闭\n');
    }
  }
}

// 显示帮助信息
if (process.argv.includes('--help') || process.argv.includes('-h')) {
  console.log('MySQL 数据库连接测试工具\n');
  console.log('使用方法:');
  console.log('  node test-mysql.js [选项]\n');
  console.log('选项:');
  console.log('  --host=主机地址        数据库主机地址 (默认: 49.51.193.79)');
  console.log('  --port=端口           数据库端口 (默认: 3306)');
  console.log('  --user=用户名         数据库用户名 (默认: prompt)');
  console.log('  --password=密码       数据库密码');
  console.log('  --database=数据库名    数据库名称 (默认: prompt)');
  console.log('  --help, -h           显示帮助信息\n');
  console.log('示例:');
  console.log('  node test-mysql.js --password=123456');
  console.log('  node test-mysql.js --host=localhost --user=root --password=123456 --database=mydb');
  console.log('  DB_PASSWORD=123456 node test-mysql.js\n');
  process.exit(0);
}

// 执行测试
testConnection().then(success => {
  process.exit(success ? 0 : 1);
}).catch(error => {
  console.error('未捕获的错误:', error);
  process.exit(1);
});
